package com.copa.ums.modules.ums.service;

import com.copa.ums.common.api.CommonPage;
import com.copa.ums.common.vo.ResponseVo;
import com.copa.ums.modules.ums.dto.UmsUserLoginDto;
import com.copa.ums.modules.ums.dto.UmsUserDto;
import com.copa.ums.modules.ums.dto.UpdateUserPasswordDto;
import com.copa.ums.modules.ums.model.UmsResource;
import com.copa.ums.modules.ums.model.UmsRole;
import com.copa.ums.modules.ums.model.UmsUser;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.List;
import java.util.Map;

/**
 * @author copa
 * @since 2022-10-31
 */
public interface UmsUserService extends IService<UmsUser> {

    /**
     * 注册功能
     */
    ResponseVo<UmsUser> register(UmsUserDto umsUserDto);

    /**
     * 获取用户信息
     */
    UserDetails loadUserByUsername(String username);

    /**
     * 根据用户名获取用户
     */
    UmsUser getUserByUsername(String username);

    /**
     * 获取指定用户的可访问资源
     */
    List<UmsResource> getResourceList(Long userId);

    /**
     * 获取缓存服务
     */
    UmsUserCacheService getCacheService();

    /**
     * 登录功能
     * @return 生成的JWT的token
     */
    ResponseVo<Map<String, String>> login(UmsUserLoginDto umsAdminLoginDto);

    /**
     * 刷新token的功能
     * @param oldToken 旧的token
     */
    ResponseVo<Map<String, String>> refreshToken(String oldToken);

    /**
     * 根据用户名获取个人信息
     * @param username 用户名
     * @return
     */
    ResponseVo<Map<String, Object>> getUserInfo(String username);

    /**
     * 根据用户名或昵称分页查询用户
     */
    ResponseVo<CommonPage<UmsUser>> list(String keyword, Integer pageSize, Integer pageNum);

    /**
     * 修改指定用户信息
     */
    ResponseVo<String> update(Long userId, UmsUser user);

    /**
     * 修改密码
     */
    ResponseVo<String> updatePassword(UpdateUserPasswordDto updateUserPasswordDto);

    /**
     * 删除指定用户
     */
    ResponseVo<String> delete(Long userId);

    /**
     * 修改用户角色关系
     */
    ResponseVo<Integer> updateRole(Long userId, List<Long> roleIds);

    /**
     * 获取用户对于角色
     */
    ResponseVo<List<UmsRole>> getRoleList(Long userId);

    /**
     * 通过资源id获取用户id组
     */
    List<Long> getUserIdListByResourceId(Long resourceId);

    /**
     * 登出
     */
    ResponseVo<String> logout(String username);
}
